থ্রেড কী এবং এর ব্যবহার

Computer Programming - সি++ প্রোগ্রামিং (C++ Programming) মাল্টিথ্রেডিং |
486
486

থ্রেড হলো প্রোগ্রামের একটি সাব-ইউনিট, যা প্রোগ্রামের নির্দিষ্ট অংশকে স্বতন্ত্রভাবে এক্সিকিউট (run) করতে সক্ষম করে। C++11 থেকে থ্রেড ব্যবস্থাপনার জন্য thread লাইব্রেরি যুক্ত করা হয়েছে, যা একই প্রোগ্রামের একাধিক অংশকে একসঙ্গে চালাতে দেয়। থ্রেড ব্যবহারের মাধ্যমে প্রোগ্রামের পারফরম্যান্স বৃদ্ধি করা যায়, কারণ এটি একাধিক কাজকে সমান্তরালভাবে (parallel) চালাতে সহায়ক।

থ্রেডের প্রয়োজনীয়তা

  1. পারফরম্যান্স বৃদ্ধি: একাধিক থ্রেড ব্যবহারের মাধ্যমে কাজগুলো সমান্তরালভাবে চালানো যায়, যা প্রোগ্রামের কার্যকারিতা বাড়ায়।
  2. অ্যাসিঙ্ক্রোনাস কাজ: থ্রেড ব্যবহার করে একই সময়ে বিভিন্ন কাজ চালানো সম্ভব হয়, যেমন ব্যাকগ্রাউন্ডে ডেটা প্রসেসিং করা।
  3. প্রোগ্রামের প্রতিক্রিয়াশীলতা বৃদ্ধি: থ্রেড ব্যবহারে প্রধান প্রোগ্রাম থ্রেড ব্যতীত অন্যান্য কাজ চালানো যায়, ফলে প্রোগ্রাম আরও প্রতিক্রিয়াশীল (responsive) হয়।

C++ এ থ্রেড ব্যবস্থাপনা

C++ এ thread লাইব্রেরি ব্যবহার করে থ্রেড তৈরি ও পরিচালনা করা হয়। একটি থ্রেড চালাতে একটি ফাংশন, মেম্বার ফাংশন, বা ল্যাম্বডা এক্সপ্রেশন দেওয়া যায়, যা থ্রেড চালানোর সময় পারফর্ম করবে।

উদাহরণ: সাধারণ থ্রেড তৈরি

cpp

Copy code

#include <iostream>
#include <thread>
using namespace std;

// একটি সাধারণ ফাংশন, যা থ্রেডের মাধ্যমে চালানো হবে
void printMessage() {
    cout << "Hello from thread!" << endl;
}

int main() {
    // একটি নতুন থ্রেড তৈরি করা এবং ফাংশন চালানো
    thread t(printMessage);

    // মূল থ্রেডে অন্য কাজ করা
    cout << "Hello from main thread!" << endl;

    // থ্রেড শেষ করা (join করা)
    t.join();

    return 0;
}

বর্ণনা:

  • printMessage নামে একটি ফাংশন তৈরি করা হয়েছে, যা থ্রেডের মাধ্যমে চালানো হবে।
  • thread t(printMessage); লাইনের মাধ্যমে একটি থ্রেড তৈরি করে printMessage ফাংশন চালানো হয়েছে।
  • t.join(); ব্যবহার করে থ্রেড শেষ হওয়ার জন্য অপেক্ষা করা হয়েছে।

থ্রেড ব্যবস্থাপনার প্রধান মেথডসমূহ

  1. join(): join() মেথড ব্যবহার করে মূল থ্রেড অন্য থ্রেড শেষ হওয়ার জন্য অপেক্ষা করে।
  2. detach(): detach() মেথড ব্যবহার করে থ্রেডকে প্রধান থ্রেড থেকে আলাদা করে দেওয়া হয়, ফলে থ্রেড নিজে থেকেই কাজ সম্পন্ন করতে পারে।
  3. joinable(): joinable() মেথড ব্যবহার করে থ্রেড join করা যায় কিনা তা পরীক্ষা করা যায়।

উদাহরণ: থ্রেড detach করা

#include <iostream>
#include <thread>
using namespace std;

void printMessage() {
    cout << "Hello from detached thread!" << endl;
}

int main() {
    thread t(printMessage);

    // থ্রেড detach করা
    t.detach();

    // মূল থ্রেডে অন্য কাজ করা
    cout << "Hello from main thread!" << endl;

    return 0;
}

বর্ণনা:

  • এখানে detach() মেথড ব্যবহার করে থ্রেডটি আলাদা করা হয়েছে, ফলে printMessage ফাংশন থ্রেড নিজে থেকেই কাজ সম্পন্ন করবে এবং মূল থ্রেড আলাদাভাবে চলতে থাকবে।

থ্রেডের মাধ্যমে প্যারামিটার পাস করা

থ্রেডের মাধ্যমে ফাংশনে প্যারামিটার পাস করা সম্ভব। প্যারামিটার পাস করার সময় std::ref ব্যবহার করে রেফারেন্স পাস করা যেতে পারে।

উদাহরণ: থ্রেডের মাধ্যমে প্যারামিটার পাস

#include <iostream>
#include <thread>
using namespace std;

void add(int a, int b) {
    cout << "Sum: " << a + b << endl;
}

int main() {
    // প্যারামিটার সহ থ্রেড চালানো
    thread t(add, 5, 10);
    t.join();

    return 0;
}

বর্ণনা:

  • add ফাংশন দুটি ইনটিজার প্যারামিটার গ্রহণ করে।
  • thread t(add, 5, 10); এর মাধ্যমে add ফাংশন ৫ এবং ১০ প্যারামিটার হিসেবে পেয়ে থ্রেডে চালিত হয়েছে।

থ্রেড সিঙ্ক্রোনাইজেশন

থ্রেড ব্যবস্থাপনায় কখনও কখনও বিভিন্ন থ্রেডের মধ্যে ডেটা সঠিকভাবে ব্যবহারের জন্য সিঙ্ক্রোনাইজেশন প্রয়োজন হয়। C++ এ মিউটেক্স (Mutex) ব্যবহার করে থ্রেড সিঙ্ক্রোনাইজেশন করা হয়, যাতে একাধিক থ্রেড একই ডেটা একসাথে মডিফাই করতে না পারে।

উদাহরণ: মিউটেক্স ব্যবহার করে থ্রেড সিঙ্ক্রোনাইজেশ

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

mutex mtx; // একটি মিউটেক্স তৈরি করা হয়েছে

void printMessage(const string& msg) {
    mtx.lock(); // মিউটেক্স লক করা
    cout << msg << endl;
    mtx.unlock(); // মিউটেক্স আনলক করা
}

int main() {
    thread t1(printMessage, "Hello from thread 1");
    thread t2(printMessage, "Hello from thread 2");

    t1.join();
    t2.join();

    return 0;
}

বর্ণনা:

  • এখানে একটি mutex তৈরি করা হয়েছে এবং mtx.lock()mtx.unlock() এর মাধ্যমে ডেটা অ্যাক্সেসের সময় লক করা হয়েছে, যাতে দুটি থ্রেড একই সময়ে একসাথে মেমোরি অ্যাক্সেস না করতে পারে।

C++ এ থ্রেড ব্যবহারের সুবিধা

  1. সমান্তরাল প্রসেসিং: থ্রেড ব্যবহার করে একই সময়ে একাধিক কাজ সম্পন্ন করা যায়, যা সময় এবং রিসোর্সের সাশ্রয় করে।
  2. প্রোগ্রামের প্রতিক্রিয়াশীলতা বৃদ্ধি: ব্যাকগ্রাউন্ডে থ্রেড ব্যবহার করে প্রোগ্রাম আরও প্রতিক্রিয়াশীল রাখা যায়।
  3. বড় কাজকে ছোট অংশে ভাগ করা: বড় কাজকে বিভিন্ন থ্রেডে ভাগ করে সহজে সম্পন্ন করা যায়।

থ্রেড ব্যবহারের সতর্কতা

  1. ডেটা রেস: একাধিক থ্রেড একই ডেটা একসাথে মডিফাই করতে চেষ্টা করলে ডেটা রেস সমস্যা হতে পারে। মিউটেক্স ব্যবহার করে এটি প্রতিরোধ করা যায়।
  2. ডেডলক: দুটি থ্রেড একে অপরের উপর নির্ভরশীল হলে ডেডলক সৃষ্টি হতে পারে।
  3. মেমোরি লিক: join বা detach না করলে থ্রেড সম্পন্ন না হওয়ার ঝুঁকি থাকে, যা মেমোরি লিক হতে পারে।

সারসংক্ষেপ

  • থ্রেড C++ এ প্রোগ্রামের একটি সাব-ইউনিট, যা প্রোগ্রামের অংশবিশেষকে স্বতন্ত্রভাবে চালায়।
  • thread লাইব্রেরির মাধ্যমে থ্রেড ব্যবস্থাপনা করা যায় এবং join, detach মেথড ব্যবহার করে থ্রেড পরিচালনা করা যায়।
  • মিউটেক্স ব্যবহার করে থ্রেড সিঙ্ক্রোনাইজেশন করা হয়, যাতে থ্রেডের মধ্যে ডেটা সঠিকভাবে ব্যবহৃত হয়।

থ্রেড ব্যবহারে প্রোগ্রামিং আরও কার্যকর এবং সময়সাশ্রয়ী হয়, তবে সঠিক ব্যবস্থাপনা নিশ্চিত করা জরুরি।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion